﻿package CutLoad.cookies
{
	
	import CutLoad.CutLoad;
	
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Graphics;
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.StageDisplayState;
	import flash.events.MouseEvent;
	import flash.external.ExternalInterface;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.net.URLRequest;
	import flash.net.navigateToURL;
	import flash.system.ApplicationDomain;
	
	/**
	 * 常用函数 
	 * @author smallerbird mail:smallerbird@gmail.com  site:www.mkigm.com QQ群:49983196
	 * 
	 */	
	public class Fun
	{
		/**
		 * Rectangle对象 containsPoint方法不能检测出它的边框点,这个方法可以替代
		 * @param rect Rectangle对象 
		 * @param p 要检测的点
		 * @return 
		 * 
		 */			
		public static function rectContainsPoint(rect:Rectangle,p:Point):Boolean{
			if((p.x>=rect.x&&p.x<=rect.x+rect.width)&&(p.y>=rect.y&&p.y<=rect.y+rect.height)){
				return true;
			}
			return false
		} 
		/**
		 * 为 Sprite添加一个鼠标点击事迹
		 * @param sp
		 * @param funClick 格式 function(e:MouseEvent):void
		 * @param buttonMode
		 * 
		 */		
		public static function addMouseClickForSprite(sp:Sprite,funClick:Function,buttonMode:Boolean=true):void{
			sp.mouseChildren=false;
			sp.buttonMode=true;
			sp.addEventListener(MouseEvent.CLICK,funClick);
		}
		/**
		 * 返回 Rectangle对象 中心点
		 * @param rect
		 * @return 
		 * 
		 */		
		public static function rectCenterPoint(rect:Rectangle):Point{
			return new Point(rect.x+rect.width/2,rect.y+rect.height/2);
		}
		/**
		 * 获得 Rectangle对象的四个点
		 * @param rect Point对象数组
		 * @return 
		 * 
		 */		
		public static function rect4Point(rect:Rectangle):Array{
			var arr:Array=new Array();
			arr.push(new Point(rect.x,rect.y));
			arr.push(new Point(rect.x+rect.width,rect.y));
			arr.push(new Point(rect.x+rect.width,rect.y+rect.height));
			arr.push(new Point(rect.x,rect.y+rect.height));
			return arr;
		}
		/**
		 * 清除数组中相同的元素   注：只能判断是否相等
		 * @param arr
		 * @return 
		 * 
		 */		
		public static function clrArrayRepeat(arr:Array):Array{
			var arrReturn:Array=new Array();
			for(var i:Number=0;i<arr.length;i++){
				var isAdd:Boolean=false;
				for(var j:Number=0;j<arrReturn.length;j++){
					if(arr[i]==arrReturn[j]){
						isAdd=true;
						break;
					}
				}
				if(!isAdd) arrReturn.push(arr[i])
			}
			return arrReturn;
		}
		/**
		 * 调用外部js 
		 * @param js代码
		 * @param arguments
		 * @return 
		 * 
		 */		
		public static function jscall(functionName:String):String{
			functionName="javascript:"+functionName;
			Fun.goToUrl(functionName,"_self");
			return functionName
		}
		/**
		 * 注册方法，让外部js调用 
		 * @param functionName
		 * @param closure
		 * 
		 */		
		public static function jscallback(functionName:String, closure:Function):void 
		{
			ExternalInterface.addCallback(functionName,closure);
		}
		/**
		 * 根据绝对路径文件名字符串返回目录部分：<p>例如：http://localhost/testswf/test_url.swf 返回==> http://localhost/testswf/ </p>
		 * <p> file:///C|/Documents%20and%20Settings/Administrator/桌面/test%5Furl.swf 返回==>file:///C|/Documents%20and%20Settings/Administrator/桌面/</p>
		 * @param strPath
		 * @return 
		 * 
		 */		
		public static function getFilePathStr(strPath:String):String{
			var str1:String="http://";
			var indexTem:Number;
			var strStr:String=".swf";
			if (strPath.indexOf(str1)==0) {
				indexTem=strPath.lastIndexOf(strStr);
			} else {
				indexTem=strPath.lastIndexOf(strStr);
			}
			if (indexTem==-1) {
				return "";
			}
			strPath=strPath.substr(0,indexTem) + strStr;
			//
			strStr="/";
			if (strPath.indexOf(str1)==0) {
				indexTem=strPath.lastIndexOf(strStr);
			} else {
				indexTem=strPath.lastIndexOf(strStr);
			}
			if (indexTem==-1) {
				return "";
			}
			strPath=strPath.substr(0,indexTem) + strStr;
			return  strPath;	
		}

		/**
		 * 打开一个网页 
		 * @param url
		 * @param strTarget
		 * 
		 */		
		public static function goToUrl(url:String,strTarget:String="_blank"):void{
			if(url=="") return;
			navigateToURL(new URLRequest(url),strTarget);
		}
		/**
		 * 把一个Object对象里所有的属性附加到别一个对象里 
		 * @param fromObj 来自这里的对象
		 * @param toObj 附加目前的对象
		 * 
		 */		
		public static function appendObj(fromObj:Object,toObj:Object):void{
			//trace("appendObj-------------------")
			for(var str:String in fromObj){
				//trace(str+":"+fromObj[str]);
				toObj[str]=fromObj[str]
			}
			/*trace("现在对象有以下属性：")
			for(var str1:String in toObj){
				trace(str1+":"+toObj[str1]);
			}*/
		}
		/**
		 * 替换字符串 
		 * @param str 要替换的内容
		 * @param seachWord 要替换的关键字
		 * @param repWord 替换的内容
		 * 
		 */		
		public static function replace(str:String,seachWord:String,repWord:String):String{
			var myPattern:RegExp =new RegExp(seachWord,"g");
			return (str.replace(myPattern,repWord));  
		}
		//排版---------------------
		/**
		 * 从第一个对象开始，以一定的间距横排 
		 * @param arrObj 若干的对象
		 * @param startx 开始位置x
		 * @param starty 开始位置y
		 * @param space 间距
		 * @param maxLen 如果要设置居中的话，这里设置居中范围的宽度.
		 * @return 返回宽度
		 */
		public static function setStartList(arrObj:Array,startx:Number,starty:Number,space:Number,maxLen:Number=0):Number{
			var numLen:Number=0;
			for(var i:Number=0;i<arrObj.length;i++){
				var objTem:Object=arrObj[i]
				if(i==0){
					objTem=arrObj[i]
					objTem.x=startx;
					objTem.y=starty;
					numLen+=objTem.getShowWidth()+space;
				}else{
					var objTem1:Object=arrObj[i-1];
					objTem.x=objTem1.getXYRightUp().x+space;
					objTem.y=starty;
					numLen+=objTem.getShowWidth();
				}				
			}
			//如果不等于0就居中
			if(maxLen!=0){
				var xx:Number=getCenterXY(maxLen,numLen);
				var temMove:Number=Math.abs(startx-xx);
				MoveSomeXY(arrObj,temMove,0);
			}
			return numLen
		}
		//
		/**
		 * 获得居中的x或y位置 
		 * @param startxy 要居中的开始坐标x或y
		 * @param maxWH 最大宽度或高度
		 * @param len 要居中对象的宽度或高度
		 * @return 返回居中的x坐标或y
		 * 
		 */		
		public static function getCenterXY(maxWH:Number,len:Number):Number{
			var w2:Number=0;
			if(maxWH>len) w2=(maxWH-len)/2;
			return w2;
			
		}
		/**
		 * 获得批理对象数组，有时候我设置了一些很规律的变量，例如:mc1,mc2,mc3..  我们想得到一个包括它们的数组[mc1,mc2,mc3..]  这个方法可以帮助你
		 * 注：这些变量必须是可以访问的
		 * @param parent 这些变量所在的父类
		 * @param propertiesName 这些变量名称想同的部份，例如：mc1,mc2,mc3 它们相同的部分为:mc
		 * @param end 结束的变量后缀名数,例如：mc1,mc2,mc3 结束的变量后缀名数为3
		 * @param start 开始的变量后缀名数，默认为0, 例如：mc1,mc2,mc3 开始的变量后缀名数为1
		 * @return 
		 * 
		 */		
		public static function getThisArry(parent:Object,propertiesName:String,end:Number,start:Number=0):Array{
			var arr:Array=new Array();
			for(var i:Number=start;i<=end;i++){
				arr.push(parent[propertiesName+i])
			}
			return arr;
		}
		/**
		 * 设置一个DisplayObject的坐标，也可设置放置的父类
		 * @param obj 显示的对象
		 * @param x x位置
		 * @param y y位置
		 * @param parent 父类
		 * 
		 */		
		public static function DisplayObjectSetXY(obj:DisplayObject,x:Number,y:Number,parent:Sprite=null):void{
			obj.x=x;
			obj.y=y;
			if(parent!=null) parent.addChild(obj);
		}
		/**
		 * 移除DisplayObject
		 * @param obj
		 * 
		 */		
		public static function DisplayObjectKillMe(obj:DisplayObject):void{
			if(obj.parent!=null){
				obj.parent.removeChild(obj);
			}
		}
		/**
		 * 移动一批对象，x或y都移动同样的距离 
		 * @param arrObj 一批对象
		 * @param xyOffset x移动一定的距离
		 * @param xyOffset y移动一定的距离
		 * 
		 */		
		public static function MoveSomeXY(arrObj:Array,xOffset:Number=0,yOffset:Number=0):void{
			var w:Number=0,h:Number=0
			for(var i:Number=0;i<arrObj.length;i++){
				if(i!=0){
					if(xOffset!=0){
						w=arrObj[i-1].x+arrObj[i-1].width;
					}else{
						w=0
					}
					if(yOffset!=0){
						h=arrObj[i-1].y+arrObj[i-1].height;
					}else{
						h=0;
					}
				}
				arrObj[i].x+=xOffset+w
				arrObj[i].y+=yOffset+h
			}
		}
		/**
		 * 从类的字符串里新建一个类 ,主要用地皮肤的生成
		 * @param p_name
		 * @return 
		 * 
		 */		
		public static function getStrClassObject(p_name : String):Object
		{
			try
			{
				var myclass:Class=ApplicationDomain.currentDomain.getDefinition(p_name) as Class;
				return new myclass();
			}
			catch (p_e : ReferenceError)
			{
				throw new Error("定义 " + p_name + " 不存在");
				return null;
			}
			return null;
		}
		/**
		 * 获取当前ApplicationDomain内的类定义
		 * 
		 * @param p_name	类名称，必须包含完整的命名空间,如 net.eidiot.net.SWFLoader
		 * @param p_info	加载swf的LoadInfo，不指定则从当前域获取
		 * @return			获取的类定义，如果不存在返回null
		 */		
		public static function getClass(p_name : String, p_info:LoaderInfo = null):Class
		{
			try
			{
				if (p_info == null)
					return ApplicationDomain.currentDomain.getDefinition(p_name) as Class;
				return p_info.applicationDomain.getDefinition(p_name) as Class;
			}
			catch (p_e : ReferenceError)
			{
				throw new Error("定义 " + p_name + " 不存在");
				return null;
			}
			return null;
		}
		/**
		 * 将一个元件的深度放在最上边。  
		 * @param tartget 目标
		 * @return 新的索引值
		 * 
		 */		
		public static function setTopDepath(tartget:DisplayObject):Number{
			if(tartget==null) return -1;
			if(tartget.parent==null) throw new Error("它没有父类！");
			var paretn:Sprite=tartget.parent as Sprite;
			var sp:Sprite=new Sprite();
			paretn.addChild(sp);
			var index:Number=paretn.getChildIndex(sp);
			paretn.swapChildren(sp,tartget);
			paretn.removeChild(sp);
			return index;
		}
		/**
		 * 清除Sprite对象所有的子类
		 * @param sp
		 * 
		 */		
		public static function clearAllChild(sp:Sprite):void{
			for(var i:Number=0;i<sp.numChildren;i++){
				var spTem:DisplayObject=sp.getChildAt(i);
				sp.removeChild(spTem);
				spTem=null;
			}
			CutLoad.CutLoad.OptimizeMemory();
		}
		/**
		 * 通过毫秒或秒获得以下标准时间格式: 小时,分,秒 
		 * @param t 毫秒
		 * @return 时间数组   ["小时","分","秒"]
		 * 
		 */		
		/**
		 * 通过毫秒或秒获得以下标准时间格式: 小时,分,秒 
		 * @param t 毫秒
		 * @param isSec 是秒还是毫秒   秒 true  毫秒 false
		 * @return 
		 * 
		 */		
		public static  function getTimeFormat(t:Number,isSec:Boolean=true):Array{
			var arrReturn:Array=new Array();
			var sec:Number=t;
			if(!isSec) sec=Math.floor(t/1000);
			var min:Number=0;
			var hour:Number=0;
			if(sec>60){
				hour=Math.floor(sec/3600);
				sec=sec-hour*3600;
				min=Math.floor(sec/60);
				sec=sec-min*60;
			}
			var strSec:String=sec>9?String(sec):"0"+sec;
			var strMin:String=min>9?String(min):"0"+min;
			var strHour:String=min>9?String(min):"0"+min;
			
			arrReturn.push(strHour);
			arrReturn.push(strMin);
			arrReturn.push(strSec);
			return arrReturn;
		}
		/**
		 * 获得当前时间的字符串 
		 * @param char1 分割符1  默认:-
		 * @param char2 分割符2  默认: 
		 * @param char3 分割符3  默认: :
		 * @return 格式如下:年-月-日  小时:分:秒
		 * 
		 */			
		public static function getNowDateTimeStr(char1:String="-",char2:String=" ",char3:String=":"):String{
			var date:Date=new Date();
			return date.getFullYear()+char1+(date.getMonth()+1)+char1+date.getDate()+char2+date.getHours()+char3+date.getMinutes()+char3+date.getSeconds();
		}
		/**
		 * 获得当前年月日的字符串 
		 * @param char1 分割符1  默认:-
		 * @return 
		 * 
		 */		
		public static function getNowDateStr(char1:String="-"):String{
			var date:Date=new Date();
			return date.getFullYear()+char1+(date.getMonth()+1)+char1+date.getDate();
		}
		/**
		 * 返回现在时间数组  
		 * @param isZero 空的地方是不是用0来填充
		 * @return   [小时,分,秒]
		 * 
		 */				
		public static function getNowTimeArr(isZero:Boolean=false):Array{
			var arrReturn:Array=new Array();
			var now:Date=new Date();
			var hour:Number=now.getHours();
			var min:Number=now.getMinutes();
			var sec:Number=now.getSeconds();
			var strZero:String=isZero==true?"0":"";
			arrReturn.push(hour>9?String(hour):strZero+hour);
			arrReturn.push(min>9?String(min):strZero+min);
			arrReturn.push(sec>9?String(sec):strZero+sec);
			return arrReturn;
		}
		/**
		 * 获得时间字符串:  
		 * @param isZero 空的地方是不是用0来填充
		 * @return  格式为:小时:分:秒
		 * 
		 */		
		public static function getNowTimeStr(isZero:Boolean=false):String{
			var arr:Array=getNowTimeArr(isZero);
			return arr[0]+":"+arr[1]+":"+arr[2];
		}
		/**
		 * 获得PI值 
		 * @param t  小位数，有时候我们不需要很精确的PI值,默认值为Math.PI
		 * @return 
		 * 
		 */		
		public static function getPI(t:Number=0):Number{
			switch(t){
				case 1:
					return 3.1;
					break;
				case 2:
					return 3.14
					break;
				case 3:
					return 3.141
					break;
				case 4:
					return 3.1415
					break;
				case 5:
					return 3.14159
					break;
				case 6:
					return 3.141592
					break;
				case 7:
					return 3.1415926;
					break;
				default:
					return Math.PI;
					break;
			}
		}
				
		/**
		 * 角度转弧度 
		 * @param angle 角度
		 * @param isPI PI值精度是否最高
		 * @return 
		 * 
		 */		
		public static function angleToRadian(angle:Number,isPI:Boolean=true):Number{
			var pi:Number=isPI?getPI():getPI(4)
			return angle*pi/180
		}
		/**
		 * 弧度转角度
		 * @param radian 弧度 
		 * @param isPI PI值精度是否最高
		 * @return 
		 * 
		 */		
		public static function radianToAngle(radian:Number,isPI:Boolean=true):Number{
			var pi:Number=isPI?getPI():getPI(4)
			return radian*180/pi
		}
		/**
		 * 获得文件后缀名  例如:mkigm.txt  将返回txt   注：返回的名称都是小写
		 * @param fileName 文件名
		 * @return 
		 * 
		 */		
		public static function getFileTypeName(fileName:String):String{
			fileName=fileName.toLocaleLowerCase();
			var arr:Array=fileName.split(".");
			return arr[arr.length-1];
		}
		/**
		 * 顺时针或逆时针旋转二维数组，返回新生成的数值 
		 * @param arr
		 * @param isClockwise true:顺时针 false逆时针
		 * @return 
		 * 
		 */		
		public static function roation2Array(arr:Array,isClockwise:Boolean=true):Array{
			var arrRoation:Array=new Array();
			if(isClockwise){
				for(var i:Number=0;i<arr[0].length;i++){
					var arrTem:Array=new Array();
					for(var j:Number=arr.length-1;j>=0;j--){
						arrTem.push(arr[j][i]);
					}
					arrRoation.push(arrTem);
				}
			}else{
				for(var k:Number=arr[0].length-1;k>=0;k--){
					var arrTem1:Array=new Array();
					for(var l:Number=0;l<arr.length;l++){
						arrTem1.push(arr[l][k]);
					}
					arrRoation.push(arrTem1);
				}
			}
			return arrRoation;
		}
		/**
		 * 打印出数据结构 
		 * <p>例子:var obj:Object = {a:1,b:2,c:"abcdef",d:"adasdfasdf",eeee:[1,2,3,"4",{id:1,name:"飞飞"}]};<br>varDescribe(obj);<br>返回结果：{a:1,b:2,c:"abcdef",d:"adasdfasdf",eeee:[1,2,3,"4",{id:1,name:"飞飞"}]}</p>
		 * @param obj 要打印的变量
		 * @param isTrace 是否使用trace打印出来，默认为true
		 * @return
		 * 
		 */		
		public static function varDescribe(obj:*,isTrace:Boolean=true):String
		{
			var str:String = "";
			if(obj is String){
				str="\""+obj+"\"";
			}else if(obj is Array){
				for(var j:Number=0;j<obj.length;j++){
					if (str == "")
					{
						str = "[";
					}
					else
					{
						str +=  ",";
					}
					str += varDescribe(obj[j],false);
				}
				str+="]";
			}else if(obj is Boolean){
				if(obj){
					str="true";
				}else{
					str="false";
				}
			}else if(obj==null){
				str="Null"
			}else if(obj is Number||obj is int||obj is uint){
				str=obj;
			}else{
				for (var i:String in obj)
				{
					if (str == "")
					{
						str = "{";
					}
					else
					{
						str +=  ",";
					}
					str +=  i + ":" + varDescribe(obj[i],false);
				}
				str+="}";
			}
			if(isTrace) trace(str);
			return str;
		}
	}
}